// Работа с буфером обмена из 1С
//
// Copyright 2020 ООО "Центр прикладных разработок"
//
//   Licensed under the Apache License, Version 2.0 (the "License");
//   you may not use this file except in compliance with the License.
//   You may obtain a copy of the License at
//
//       http://www.apache.org/licenses/LICENSE-2.0
//
//   Unless required by applicable law or agreed to in writing, software
//   distributed under the License is distributed on an "AS IS" BASIS,
//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//   See the License for the specific language governing permissions and
//   limitations under the License.
//
//
// URL:    https://github.com/cpr1c/clipboard_1c
// Требования: платформа 1С версии 8.3.14 и выше
// С более ранними платформами могут быть проблемы с подключением компоненты, а также с работой некоторых методов

#Область ПрограммныйИнтерфейс

// Возвращает текущую версию подсистемы
// 
// Возвращаемое значение:
// 	Строка - Версия подсистемы работы с буфером обмена
Функция ВерсияПодсистемы() Экспорт
	Возврат "2.0.2";
КонецФункции

// Доступно использование платформенных возможностей.
// 
// Возвращаемое значение:
// Булево 
Функция ДоступноИспользованиеПлатформенныхВозможностей() Экспорт
	Если ВерсияПлатформыНеМладше("8.3.24") Тогда
		Возврат УИ_БуферОбменаПлатформаКлиент.ИспользованиеПлатформенногоБуфераОбменаДоступно();
	КонецЕсли;	
	
	Возврат Ложь;
КонецФункции

// Начинает очистку содержимого буфера обмена
// 
// Параметры:
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<РезультатОчистки> – Результат очистки, Тип: Булево. Неопределено- если не удалось подключить компоненту
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
Процедура НачатьОчисткуБуфераОбмена(ОписаниеОповещения) Экспорт
	МодульБуфераОбменаДляИспользования().НачатьОчисткуБуфераОбмена(ОписаниеОповещения);
КонецПроцедуры

// Начинает помещение картинку в буфер обмена
// 
// Параметры:
// 	Картинка - Картинка, Строка, ДвоичныеДанные -
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<Результат> – Результат установки картинки в буфере обмена, Тип: Булево. Неопределено- если не удалось подключить компоненту
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
Процедура НачатьКопированиеКартинкиВБуфер(Картинка, ОписаниеОповещения) Экспорт
	КаринкаДляКопирования = КартинкаДляКопированияВБуфер(Картинка);
	Если КаринкаДляКопирования = Неопределено Тогда
		Возврат;
	КонецЕсли;
	МодульБуфераОбменаДляРаботыСКартинками().НачатьКопированиеКартинкиВБуфер(КаринкаДляКопирования, ОписаниеОповещения);
КонецПроцедуры

// Начинает получение картинки из буфера обмена
// 
// Параметры:
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<ДанныеКартинки> – Данные картинки в запрошенном формате, Тип: Строка, ДвоичныеДанные, Картинка. Неопределено- если не удалось подключить компоненту или в буфере нет картинки
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
// 	ВариантПолучения - Строка
// 	Один из варинатов:
// 		ДвоичныеДанные- получение двоичных данных картинки
// 		Картинка- Преобразованное к типу "Картинка" содержание буфера
// 		Адрес- Адрес двоичных данных картинки во временном хранилище
Процедура НачатьПолучениеКартинкиИзБуфера(ОписаниеОповещения, ВариантПолучения = "Картинка") Экспорт
	МодульБуфераОбменаДляРаботыСКартинками().НачатьПолучениеКартинкиИзБуфера(ОписаниеОповещения, ВариантПолучения);
КонецПроцедуры

// Начинает помещение текста в буфер обмена
// 
// Параметры:
// 	СтрокаКопирования- Строка- Строка, которую необходимо поместить в буфер обмена
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<Результат> – Результат установки текста в буфере обмена, Тип: Булево. Неопределено- если не удалось подключить компоненту
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
Процедура НачатьКопированиеСтрокиВБуфер(СтрокаКопирования, ОписаниеОповещения) Экспорт
	МодульБуфераОбменаДляИспользования().НачатьКопированиеСтрокиВБуфер(СтрокаКопирования, ОписаниеОповещения);
КонецПроцедуры


// Начинает получение текста из буфера обмена
// 
// Параметры:
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<Результат> – Текст из буфера обмена, Тип: Строка. Неопределено- если не удалось подключить компоненту
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
Процедура НачатьПолучениеСтрокиИзБуфера(ОписаниеОповещения) Экспорт
	МодульБуфераОбменаДляИспользования().НачатьПолучениеСтрокиИзБуфера(ОписаниеОповещения);
КонецПроцедуры


// Начинает получение формата текущего значения в буфере обмена
// 
// Параметры:
// 	ОписаниеОповещения - ОписаниеОповещения - Содержит описание процедуры, которая будет вызвана после завершения со следующими параметрами:
//	<Результат> – Строка в формате JSON, содержащая описание формата содержимого буфера обмена, Тип: Строка. Неопределено- если не удалось подключить компоненту
//	<ДополнительныеПараметры> - значение, которое было указано при создании объекта ОписаниеОповещения.
Процедура НачатьПолучениеФорматаБуфераОбмена(ОписаниеОповещения) Экспорт
	МодульБуфераОбменаДляИспользования().НачатьПолучениеФорматаБуфераОбмена(ОписаниеОповещения);
КонецПроцедуры


#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс


#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Модуль буфера обмена для использования.
// 
// Возвращаемое значение:
//  ОбщийМодуль
Функция МодульБуфераОбменаДляИспользования() 
	Если ДоступноИспользованиеПлатформенныхВозможностей() Тогда
		Возврат УИ_БуферОбменаПлатформаКлиент;	
	Иначе
		Возврат УИ_БуферОбменаКомпонентаКлиент;	
	КонецЕсли;
КонецФункции

// Модуль буфера обмена для использования.
// 
// Возвращаемое значение:
//  ОбщийМодуль
Функция МодульБуфераОбменаДляРаботыСКартинками() 
	Если ДоступноИспользованиеПлатформенныхВозможностей() И Не ЭтоLinux() Тогда
		Возврат УИ_БуферОбменаПлатформаКлиент;	
	Иначе
		Возврат УИ_БуферОбменаКомпонентаКлиент;	
	КонецЕсли;
КонецФункции

// Текущая версия платформы1 с предприятие.
// 
// Возвращаемое значение:
//  Строка -  Текущая версия платформы 1С предприятие
Функция ТекущаяВерсияПлатформы1СПредприятие()

	СистИнфо = Новый СистемнаяИнформация;
	Возврат СистИнфо.ВерсияПриложения;

КонецФункции

// Версия платформы не младше.
// 
// Параметры:
//  ВерсияДляСравнения - Строка -  Версия для сравнения
// 
// Возвращаемое значение:
//  Булево -  Версия платформы не младше
Функция ВерсияПлатформыНеМладше(ВерсияДляСравнения) 
	ВерсияБезСборки=ВерсияКонфигурацииБезНомераСборки(ТекущаяВерсияПлатформы1СПредприятие());

	Возврат СравнитьВерсииБезНомераСборки(ВерсияБезСборки, ВерсияДляСравнения)>=0;
КонецФункции

// Получает номер версии конфигурации без номера сборки.
//
// Параметры:
//  Версия - Строка - версия конфигурации в формате РР.ПП.ЗЗ.СС,
//                    где СС - номер сборки, который будет удален.
// 
// Возвращаемое значение:
//  Строка - номер версии конфигурации без номера сборки в формате РР.ПП.ЗЗ.
//
Функция ВерсияКонфигурацииБезНомераСборки(Знач Версия) 

	Массив = СтрРазделить(Версия, ".");

	Если Массив.Количество() < 3 Тогда
		Возврат Версия;
	КонецЕсли;

	Результат = "[Редакция].[Подредакция].[Релиз]";
	Результат = СтрЗаменить(Результат, "[Редакция]", Массив[0]);
	Результат = СтрЗаменить(Результат, "[Подредакция]", Массив[1]);
	Результат = СтрЗаменить(Результат, "[Релиз]", Массив[2]);

	Возврат Результат;
КонецФункции

// Сравнить две строки версий.
//
// Параметры:
//  СтрокаВерсии1  - Строка - номер версии в формате РР.{П|ПП}.ЗЗ.
//  СтрокаВерсии2  - Строка - второй сравниваемый номер версии.
//
// Возвращаемое значение:
//   Число   - больше 0, если СтрокаВерсии1 > СтрокаВерсии2; 0, если версии равны.
//
Функция СравнитьВерсииБезНомераСборки(Знач СтрокаВерсии1, Знач СтрокаВерсии2) 

	Строка1 = ?(ПустаяСтрока(СтрокаВерсии1), "0.0.0", СтрокаВерсии1);
	Строка2 = ?(ПустаяСтрока(СтрокаВерсии2), "0.0.0", СтрокаВерсии2);
	Версия1 = СтрРазделить(Строка1, ".");
	Если Версия1.Количество() <> 3 Тогда
		ВызватьИсключение СтрШаблон(НСтр("ru = 'Неправильный формат параметра СтрокаВерсии1: %1'"), СтрокаВерсии1);
	КонецЕсли;
	Версия2 = СтрРазделить(Строка2, ".");
	Если Версия2.Количество() <> 3 Тогда
		ВызватьИсключение СтрШаблон(НСтр("ru = 'Неправильный формат параметра СтрокаВерсии2: %1'"), СтрокаВерсии2);
	КонецЕсли;

	Результат = 0;
	Для Разряд = 0 По 2 Цикл
		Результат = Число(Версия1[Разряд]) - Число(Версия2[Разряд]);
		Если Результат <> 0 Тогда
			Возврат Результат;
		КонецЕсли;
	КонецЦикла;
	Возврат Результат;

КонецФункции

// Картинка для копирования в буфер.
// 
// Параметры:
//  Картинка- Строка, Картинка, ДвоичныеДанные - Картинка
// 
// Возвращаемое значение:
//  Неопределено, Картинка - Картинка для копирования в буфер
Функция КартинкаДляКопированияВБуфер(Картинка)
	Если ТипЗнч(Картинка) = Тип("Строка") И ЭтоАдресВременногоХранилища(Картинка) Тогда
		ТекКартинка=ПолучитьИзВременногоХранилища(Картинка);
	Иначе
		ТекКартинка=Картинка;
	КонецЕсли;

	Если ТипЗнч(ТекКартинка) = Тип("Картинка") Тогда
		Возврат ТекКартинка;
	ИначеЕсли ТипЗнч(ТекКартинка) = Тип("ДвоичныеДанные") Тогда
		Возврат Новый Картинка(ТекКартинка);
	Иначе
		Сообщить("Неверный тип картинки");
		Возврат Неопределено;
	КонецЕсли;
КонецФункции

// Это linux.
// 
// Возвращаемое значение:
//  Булево -  Это linux
Функция ЭтоLinux() Экспорт
	СистемнаяИнформация = Новый СистемнаяИнформация;
	Возврат СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Или СистемнаяИнформация.ТипПлатформы
		= ТипПлатформы.Linux_x86_64;
КонецФункции



#КонецОбласти